<?php

/**
 * Adatok ellenőrzését végző osztály
 * @author Dobai Csaba (promtheues) <csaba.dobai@php-sparcle.com>
 */
class Task_DataValidator
{
	const VALID_NOT_EMPTY	= '!^.+$!ius';
	const VALID_ANYTHING	= '!^.*$!ius';
	const VALID_ALPHA		= '!^[-\w\.]+$!iu';
	const VALID_NUM			= '!^[0-9]+$!i';
	const VALID_ALPHANUM	= '!^[-\w\d_\.\(\)\/\,]+$!iu';
	const VALID_EMAIL		= '!^[-a-z0-9_\.]+@[-a-z0-9_]+\.[a-z]+$!i';
	/** Aggregations: */

	/** Compositions: */

	/*** Attributes: ***/

	/**
	 * @access public
	 * @var Array
	 */
	public $error = array();


	/**
	 * Az átadott ellenőrzőtömb alapján formátum ellenőrzést végez az adatokon (data
	 * paraméter). Siker esetén TRUE-val tér vissza, egyébkként FALSE-szal, és az error
	 * tömbben felsorolásra kerülnek a hibás adatok kulcsai.
	 *
	 * @param array formats Formátum ellenőrző regex-ek asszociatív tömbben. A
	 * tömb kulcsai igazodnak az ellenőrzésre átadott tömb kulcsaihoz.
	 * @param array data Az ellenőrizendő adatok tömbje.
	 * @return int
	 * @access public
	 */
	public function isValid( $formats,  $data )
	{
		foreach ($formats as $key=>$regex)
		{
			if (is_array($regex))
			{
				$foundValid = FALSE;
				foreach ($regex as $reItem)
				{
					if ($this->isItemValid($key, $data, $reItem))
					{
						$foundValid = TRUE;
						break;
					} // if
				} // foreach
				
				if (!$foundValid)
				{
					$this->error[$key] = TRUE;
				} // if
			}
			else
			{
				if (!$this->isItemValid($key, $data, $regex))
				{
					$this->error[$key] = TRUE;
				} // if
			} // if
		} // foreach
		
		return !((bool)count($this->error));
	} // end of member function validate

	private function isItemValid($key, $data, $regex)
	{
		if (array_key_exists($key, $data))
		{
			if (is_array($data[$key]))
			{
				foreach ($data[$key] as $dataItem)
				{
					if (!preg_match($regex, $dataItem))
					{
						return FALSE;
					} // if
				} // foreach
			}
			else
			{
				if (!preg_match($regex, $data[$key]))
				{
					return FALSE;
				} // if
			} // if
		}
		else
		{
			return FALSE;
		} // if
		
		return TRUE;
	} // function
} // end of Task_DataValidator
?>
